package pe.com.ztaxi.taxis.service;

import java.util.Date;
import java.util.List;

import pe.com.ztaxi.taxis.model.Destino;
import pe.com.ztaxi.taxis.model.Empresa;
import pe.com.ztaxi.taxis.model.FiltroHistorial;
import pe.com.ztaxi.taxis.model.OrdenServicio;
import pe.com.ztaxi.taxis.model.Pasajero;
import pe.com.ztaxi.taxis.model.Punto;
import pe.com.ztaxi.taxis.model.UnidadMovil;
import pe.com.ztaxi.taxis.model.Usuario;

public interface OrdenServicioService {

	public OrdenServicio grabarOrdenServicio(List<Destino> listaDestinos, Punto origen, List<Pasajero> listaPasajeros, List<Date> listaFechas, String tipoServicio, String tipoVehiculo, boolean maleteraAmplia, boolean pagoAlCredito, Usuario solicitante, Integer centroCosto);
	
	public OrdenServicio modificarOrdenServicio(List<Destino> listaDestinos, Punto origen, Pasajero pasajero, Date fecha, String tipoServicio, String tipoVehiculo, boolean maleteraAmplia, boolean pagoAlCredito, Usuario solicitante, Integer numReserva, Integer centroCosto);
	
	public OrdenServicio modificarOrdenServicio(OrdenServicio ordenServicio);
	
	public boolean validacionPasajeros(List<Pasajero> pasajeros, Usuario solicitante, List<Date> listaFechas);
	
	public boolean validacionFechas(List<Date> fechas);
	
	public List<OrdenServicio> buscarOrdenesPendientesEnProceso(Empresa empresa);
	
	public List<OrdenServicio> buscarOrdenesPendientesEnProceso();
	
	public List<OrdenServicio> buscarOrdenesNoAsignadas();
	
	public List<OrdenServicio> buscarOrdenesAsignadasPorLlegar();	
	
	public List<OrdenServicio> buscarOrdenesAsignadasNoConfirmadas();
	
	public List<OrdenServicio> buscarOrdenesAsignadasEnEspera();
	
	public List<OrdenServicio> buscarOrdenesTerminadasCanceladas(Empresa empresa);
	
	public List<OrdenServicio> buscarOrdenesTerminadasCanceladas();
	
	public List<OrdenServicio> buscarOrdenesTerminadasCanceladas(Empresa empresa, FiltroHistorial filtro);
	
	public List<OrdenServicio> buscarOrdenesTerminadasCanceladas(FiltroHistorial filtro);
	
	public OrdenServicio buscarPorCodigo(Integer codigoOrden);
	
	public Double getTotalContado(List<OrdenServicio> ordenes);
	
	public Double getTotalCredito(List<OrdenServicio> ordenes);
	
	public OrdenServicio evaluarOrdenServicio(OrdenServicio provisional);
	
	public boolean cancelarOrdenesServicio(Integer[] codigosOrdenes);
	
	public OrdenServicio asignarUnidad(OrdenServicio orden, UnidadMovil unidad);
	
	public OrdenServicio alertarRetrazo(OrdenServicio ordenServicio);
	
	public String[] getAlertasEmergentes(List<OrdenServicio> ordenes);
	
	public void confirmarRecepcion(OrdenServicio ordenServicio);
	
	public void actualizarHoraInicioOrigen(OrdenServicio ordenServicio);
	
	public void actualizarHoraLlegadaOrigen(OrdenServicio ordenServicio);
	
	public void actualizarHoraInicioPrimerDestino(OrdenServicio ordenServicio);	
	
	public void resetOrdenServicio(OrdenServicio ordenServicio);
	
}
